Micron Document
🎖️GitЯра🎖️


Displaying Raw • Download

core/service/src/androidHostTest/kotlin/org/meshtastic/core/service/SendMessageWorkerTest.kt fix/qr-error-correction (7b45f84f) Text, 15.31 KB

T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.core.service

Tff7b72import T7ee787android.content.Context
Tff7b72import T7ee787androidx.test.core.app.ApplicationProvider
Tff7b72import T7ee787androidx.work.ListenableWorker
Tff7b72import T7ee787androidx.work.WorkerParameters
Tff7b72import T7ee787androidx.work.testing.TestListenableWorkerBuilder
Tff7b72import T7ee787androidx.work.workDataOf
Tff7b72import T7ee787dev.mokkery.MockMode
Tff7b72import T7ee787dev.mokkery.answering.returns
Tff7b72import T7ee787dev.mokkery.everySuspend
Tff7b72import T7ee787dev.mokkery.matcher.any
Tff7b72import T7ee787dev.mokkery.mock
Tff7b72import T7ee787dev.mokkery.verify.VerifyMode
Tff7b72import T7ee787dev.mokkery.verifySuspend
Tff7b72import T7ee787kotlinx.coroutines.CompletableDeferred
Tff7b72import T7ee787kotlinx.coroutines.async
Tff7b72import T7ee787kotlinx.coroutines.test.runTest
Tff7b72import T7ee787okio.ByteString.Companion.toByteString
Tff7b72import T7ee787org.junit.Before
Tff7b72import T7ee787org.junit.Test
Tff7b72import T7ee787org.junit.runner.RunWith
Tff7b72import T7ee787org.meshtastic.core.model.ConnectionState
Tff7b72import T7ee787org.meshtastic.core.model.DataPacket
Tff7b72import T7ee787org.meshtastic.core.model.MessageStatus
Tff7b72import T7ee787org.meshtastic.core.repository.PacketRepository
Tff7b72import T7ee787org.meshtastic.core.repository.PersistedPacket
Tff7b72import T7ee787org.meshtastic.core.repository.PersistedPacketId
Tff7b72import T7ee787org.meshtastic.core.service.worker.SendMessageWorker
Tff7b72import T7ee787org.meshtastic.core.testing.FakeRadioController
Tff7b72import T7ee787org.robolectric.RobolectricTestRunner
Tff7b72import T7ee787org.robolectric.annotation.Config
Tff7b72import T7ee787kotlin.test.assertEquals

Tf0883e@RunWithTb4b4b4(Te6edf3RobolectricTestRunnerTff7b72::Te6edf3classTb4b4b4)
Tf0883e@ConfigTb4b4b4(Te6edf3sdk Tff7b72= Tff7b72[T79c0ff3T79c0ff4Tff7b72]Tb4b4b4)
Tff7b72class T56d364SendMessageWorkerTest Tb4b4b4{

Tff7b72private Tff7b72lateinit Tff7b72var Te6edf3contextTb4b4b4: Te6edf3Context
Tff7b72private Tff7b72lateinit Tff7b72var Te6edf3packetRepositoryTb4b4b4: Te6edf3PacketRepository
Tff7b72private Tff7b72lateinit Tff7b72var Te6edf3radioControllerTb4b4b4: Te6edf3FakeRadioController

Tf0883e@Before
Tff7b72fun Td2a8ffsetUpTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3context Tff7b72= Te6edf3ApplicationProviderTb4b4b4.Te6edf3getApplicationContextTb4b4b4(Tb4b4b4)
Te6edf3packetRepository Tff7b72= Te6edf3mockTb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)
Te6edf3radioController Tff7b72= Te6edf3FakeRadioControllerTb4b4b4(Tb4b4b4)
Te6edf3radioControllerTb4b4b4.Te6edf3setConnectionStateTb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3ConnectedTb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ff`doWork returns success when packet is sent successfully`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
T8b949e// Arrange
Tff7b72val Te6edf3packetId Tff7b72= Te6edf3PersistedPacketIdTb4b4b4(Te6edf3myNodeNum Tff7b72= T79c0ff1T79c0ff2T79c0ff3Tb4b4b4, Te6edf3uuid Tff7b72= T79c0ff1T79c0ff2T79c0ff3T79c0ff4T79c0ff5LTb4b4b4)
Tff7b72val Te6edf3dataPacket Tff7b72=
Te6edf3DataPacketTb4b4b4(
Te6edf3to Tff7b72= Ta5d6ff"Ta5d6ffdestTa5d6ff"Tb4b4b4,
Te6edf3bytes Tff7b72= Ta5d6ff"Ta5d6ffHelloTa5d6ff"Tb4b4b4.Te6edf3encodeToByteArrayTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toByteStringTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3dataType Tff7b72= T79c0ff0Tb4b4b4,
Te6edf3status Tff7b72= Te6edf3MessageStatusTb4b4b4.Te6edf3QUEUEDTb4b4b4,
Tb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3claimQueuedPacketTb4b4b4(Te6edf3packetIdTb4b4b4) Tb4b4b4} Te6edf3returns Te6edf3PersistedPacketTb4b4b4(Te6edf3packetIdTb4b4b4, Te6edf3dataPacketTb4b4b4)

Tff7b72val Te6edf3worker Tff7b72=
Te6edf3TestListenableWorkerBuilderTff7b72<Te6edf3SendMessageWorkerTff7b72>Tb4b4b4(Te6edf3contextTb4b4b4)
Tb4b4b4.Te6edf3setInputDataTb4b4b4(
Te6edf3workDataOfTb4b4b4(
Te6edf3SendMessageWorkerTb4b4b4.Te6edf3KEY_PACKET_UUID Te6edf3to Te6edf3packetIdTb4b4b4.Te6edf3uuidTb4b4b4,
Te6edf3SendMessageWorkerTb4b4b4.Te6edf3KEY_MY_NODE_NUM Te6edf3to Te6edf3packetIdTb4b4b4.Te6edf3myNodeNumTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4.Te6edf3setWorkerFactoryTb4b4b4(
Tff7b72object Tb4b4b4: T56d364androidxTb4b4b4.Te6edf3workTb4b4b4.Te6edf3WorkerFactoryTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72override Tff7b72fun Td2a8ffcreateWorkerTb4b4b4(
Te6edf3appContextTb4b4b4: Te6edf3ContextTb4b4b4,
Te6edf3workerClassNameTb4b4b4: Tffa657StringTb4b4b4,
Te6edf3workerParametersTb4b4b4: Te6edf3WorkerParametersTb4b4b4,
Tb4b4b4)Tb4b4b4: Te6edf3ListenableWorker? Tff7b72=
Te6edf3SendMessageWorkerTb4b4b4(Te6edf3appContextTb4b4b4, Te6edf3workerParametersTb4b4b4, Te6edf3packetRepositoryTb4b4b4, Te6edf3radioControllerTb4b4b4)
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)

T8b949e// Act
Tff7b72val Te6edf3result Tff7b72= Te6edf3workerTb4b4b4.Te6edf3doWorkTb4b4b4(Tb4b4b4)

T8b949e// Assert
Te6edf3assertEqualsTb4b4b4(Te6edf3ListenableWorkerTb4b4b4.Te6edf3ResultTb4b4b4.Te6edf3successTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3resultTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3listOfTb4b4b4(Te6edf3dataPacketTb4b4b4)Tb4b4b4, Te6edf3radioControllerTb4b4b4.Te6edf3sentPacketsTb4b4b4)
Te6edf3verifySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3claimQueuedPacketTb4b4b4(Te6edf3packetIdTb4b4b4) Tb4b4b4}
Te6edf3verifySuspendTb4b4b4(Te6edf3mode Tff7b72= Te6edf3VerifyModeTb4b4b4.Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3rollbackEnroutePacketTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ff`doWork returns retry when radio is disconnected`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
T8b949e// Arrange
Tff7b72val Te6edf3packetId Tff7b72= Te6edf3PersistedPacketIdTb4b4b4(Te6edf3myNodeNum Tff7b72= T79c0ff1T79c0ff2T79c0ff3Tb4b4b4, Te6edf3uuid Tff7b72= T79c0ff1T79c0ff2T79c0ff3T79c0ff4T79c0ff5LTb4b4b4)
Te6edf3radioControllerTb4b4b4.Te6edf3setConnectionStateTb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3DisconnectedTb4b4b4)

Tff7b72val Te6edf3worker Tff7b72=
Te6edf3TestListenableWorkerBuilderTff7b72<Te6edf3SendMessageWorkerTff7b72>Tb4b4b4(Te6edf3contextTb4b4b4)
Tb4b4b4.Te6edf3setInputDataTb4b4b4(
Te6edf3workDataOfTb4b4b4(
Te6edf3SendMessageWorkerTb4b4b4.Te6edf3KEY_PACKET_UUID Te6edf3to Te6edf3packetIdTb4b4b4.Te6edf3uuidTb4b4b4,
Te6edf3SendMessageWorkerTb4b4b4.Te6edf3KEY_MY_NODE_NUM Te6edf3to Te6edf3packetIdTb4b4b4.Te6edf3myNodeNumTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4.Te6edf3setWorkerFactoryTb4b4b4(
Tff7b72object Tb4b4b4: T56d364androidxTb4b4b4.Te6edf3workTb4b4b4.Te6edf3WorkerFactoryTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72override Tff7b72fun Td2a8ffcreateWorkerTb4b4b4(
Te6edf3appContextTb4b4b4: Te6edf3ContextTb4b4b4,
Te6edf3workerClassNameTb4b4b4: Tffa657StringTb4b4b4,
Te6edf3workerParametersTb4b4b4: Te6edf3WorkerParametersTb4b4b4,
Tb4b4b4)Tb4b4b4: Te6edf3ListenableWorker? Tff7b72=
Te6edf3SendMessageWorkerTb4b4b4(Te6edf3appContextTb4b4b4, Te6edf3workerParametersTb4b4b4, Te6edf3packetRepositoryTb4b4b4, Te6edf3radioControllerTb4b4b4)
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)

T8b949e// Act
Tff7b72val Te6edf3result Tff7b72= Te6edf3workerTb4b4b4.Te6edf3doWorkTb4b4b4(Tb4b4b4)

T8b949e// Assert
Te6edf3assertEqualsTb4b4b4(Te6edf3ListenableWorkerTb4b4b4.Te6edf3ResultTb4b4b4.Te6edf3retryTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3resultTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3emptyListTff7b72<Te6edf3DataPacketTff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3radioControllerTb4b4b4.Te6edf3sentPacketsTb4b4b4)
Te6edf3verifySuspendTb4b4b4(Te6edf3mode Tff7b72= Te6edf3VerifyModeTb4b4b4.Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3claimQueuedPacketTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ff`doWork returns failure when packet id is missing`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3worker Tff7b72=
Te6edf3TestListenableWorkerBuilderTff7b72<Te6edf3SendMessageWorkerTff7b72>Tb4b4b4(Te6edf3contextTb4b4b4)
Tb4b4b4.Te6edf3setWorkerFactoryTb4b4b4(
Tff7b72object Tb4b4b4: T56d364androidxTb4b4b4.Te6edf3workTb4b4b4.Te6edf3WorkerFactoryTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72override Tff7b72fun Td2a8ffcreateWorkerTb4b4b4(
Te6edf3appContextTb4b4b4: Te6edf3ContextTb4b4b4,
Te6edf3workerClassNameTb4b4b4: Tffa657StringTb4b4b4,
Te6edf3workerParametersTb4b4b4: Te6edf3WorkerParametersTb4b4b4,
Tb4b4b4)Tb4b4b4: Te6edf3ListenableWorker? Tff7b72=
Te6edf3SendMessageWorkerTb4b4b4(Te6edf3appContextTb4b4b4, Te6edf3workerParametersTb4b4b4, Te6edf3packetRepositoryTb4b4b4, Te6edf3radioControllerTb4b4b4)
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)

Tff7b72val Te6edf3result Tff7b72= Te6edf3workerTb4b4b4.Te6edf3doWorkTb4b4b4(Tb4b4b4)

Te6edf3assertEqualsTb4b4b4(Te6edf3ListenableWorkerTb4b4b4.Te6edf3ResultTb4b4b4.Te6edf3failureTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3resultTb4b4b4)
Te6edf3verifySuspendTb4b4b4(Te6edf3mode Tff7b72= Te6edf3VerifyModeTb4b4b4.Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3claimQueuedPacketTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ff`doWork returns retry and marks queued when send throws`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3packetId Tff7b72= Te6edf3PersistedPacketIdTb4b4b4(Te6edf3myNodeNum Tff7b72= T79c0ff1T79c0ff2T79c0ff3Tb4b4b4, Te6edf3uuid Tff7b72= T79c0ff1T79c0ff2T79c0ff3T79c0ff4T79c0ff5LTb4b4b4)
Tff7b72val Te6edf3dataPacket Tff7b72=
Te6edf3DataPacketTb4b4b4(
Te6edf3to Tff7b72= Ta5d6ff"Ta5d6ffdestTa5d6ff"Tb4b4b4,
Te6edf3bytes Tff7b72= Ta5d6ff"Ta5d6ffHelloTa5d6ff"Tb4b4b4.Te6edf3encodeToByteArrayTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toByteStringTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3dataType Tff7b72= T79c0ff0Tb4b4b4,
Te6edf3status Tff7b72= Te6edf3MessageStatusTb4b4b4.Te6edf3QUEUEDTb4b4b4,
Tb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3claimQueuedPacketTb4b4b4(Te6edf3packetIdTb4b4b4) Tb4b4b4} Te6edf3returns Te6edf3PersistedPacketTb4b4b4(Te6edf3packetIdTb4b4b4, Te6edf3dataPacketTb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3rollbackEnroutePacketTb4b4b4(Te6edf3packetIdTb4b4b4) Tb4b4b4} Te6edf3returns Tff7b72true
Te6edf3radioControllerTb4b4b4.Te6edf3throwOnSend Tff7b72= Tff7b72true

Tff7b72val Te6edf3worker Tff7b72=
Te6edf3TestListenableWorkerBuilderTff7b72<Te6edf3SendMessageWorkerTff7b72>Tb4b4b4(Te6edf3contextTb4b4b4)
Tb4b4b4.Te6edf3setInputDataTb4b4b4(
Te6edf3workDataOfTb4b4b4(
Te6edf3SendMessageWorkerTb4b4b4.Te6edf3KEY_PACKET_UUID Te6edf3to Te6edf3packetIdTb4b4b4.Te6edf3uuidTb4b4b4,
Te6edf3SendMessageWorkerTb4b4b4.Te6edf3KEY_MY_NODE_NUM Te6edf3to Te6edf3packetIdTb4b4b4.Te6edf3myNodeNumTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4.Te6edf3setWorkerFactoryTb4b4b4(
Tff7b72object Tb4b4b4: T56d364androidxTb4b4b4.Te6edf3workTb4b4b4.Te6edf3WorkerFactoryTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72override Tff7b72fun Td2a8ffcreateWorkerTb4b4b4(
Te6edf3appContextTb4b4b4: Te6edf3ContextTb4b4b4,
Te6edf3workerClassNameTb4b4b4: Tffa657StringTb4b4b4,
Te6edf3workerParametersTb4b4b4: Te6edf3WorkerParametersTb4b4b4,
Tb4b4b4)Tb4b4b4: Te6edf3ListenableWorker? Tff7b72=
Te6edf3SendMessageWorkerTb4b4b4(Te6edf3appContextTb4b4b4, Te6edf3workerParametersTb4b4b4, Te6edf3packetRepositoryTb4b4b4, Te6edf3radioControllerTb4b4b4)
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)

Tff7b72val Te6edf3result Tff7b72= Te6edf3workerTb4b4b4.Te6edf3doWorkTb4b4b4(Tb4b4b4)

Te6edf3assertEqualsTb4b4b4(Te6edf3ListenableWorkerTb4b4b4.Te6edf3ResultTb4b4b4.Te6edf3retryTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3resultTb4b4b4)
Te6edf3verifySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3rollbackEnroutePacketTb4b4b4(Te6edf3packetIdTb4b4b4) Tb4b4b4}
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ff`two queued rows with the same mesh packet id both survive and send`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3firstId Tff7b72= Te6edf3PersistedPacketIdTb4b4b4(Te6edf3myNodeNum Tff7b72= T79c0ff1T79c0ff2T79c0ff3Tb4b4b4, Te6edf3uuid Tff7b72= T79c0ff1LTb4b4b4)
Tff7b72val Te6edf3secondId Tff7b72= Te6edf3PersistedPacketIdTb4b4b4(Te6edf3myNodeNum Tff7b72= T79c0ff1T79c0ff2T79c0ff3Tb4b4b4, Te6edf3uuid Tff7b72= T79c0ff2LTb4b4b4)
Tff7b72val Te6edf3first Tff7b72=
Te6edf3DataPacketTb4b4b4(
Te6edf3to Tff7b72= Ta5d6ff"Ta5d6ff!aaaa0001Ta5d6ff"Tb4b4b4,
Te6edf3bytes Tff7b72= Ta5d6ff"Ta5d6fffirstTa5d6ff"Tb4b4b4.Te6edf3encodeToByteArrayTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toByteStringTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3dataType Tff7b72= T79c0ff1Tb4b4b4,
Te6edf3id Tff7b72= T79c0ff7T79c0ff7Tb4b4b4,
Te6edf3status Tff7b72= Te6edf3MessageStatusTb4b4b4.Te6edf3QUEUEDTb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3second Tff7b72=
Te6edf3DataPacketTb4b4b4(
Te6edf3to Tff7b72= Ta5d6ff"Ta5d6ff!aaaa0001Ta5d6ff"Tb4b4b4,
Te6edf3bytes Tff7b72= Ta5d6ff"Ta5d6ffsecondTa5d6ff"Tb4b4b4.Te6edf3encodeToByteArrayTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toByteStringTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3dataType Tff7b72= T79c0ff1Tb4b4b4,
Te6edf3id Tff7b72= T79c0ff7T79c0ff7Tb4b4b4,
Te6edf3status Tff7b72= Te6edf3MessageStatusTb4b4b4.Te6edf3QUEUEDTb4b4b4,
Tb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3claimQueuedPacketTb4b4b4(Te6edf3firstIdTb4b4b4) Tb4b4b4} Te6edf3returns Te6edf3PersistedPacketTb4b4b4(Te6edf3firstIdTb4b4b4, Te6edf3firstTb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3claimQueuedPacketTb4b4b4(Te6edf3secondIdTb4b4b4) Tb4b4b4} Te6edf3returns Te6edf3PersistedPacketTb4b4b4(Te6edf3secondIdTb4b4b4, Te6edf3secondTb4b4b4)

Tff7b72val Te6edf3firstResult Tff7b72= Te6edf3workerTb4b4b4(Te6edf3packetRepositoryTb4b4b4, Te6edf3firstIdTb4b4b4)Tb4b4b4.Te6edf3doWorkTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3secondResult Tff7b72= Te6edf3workerTb4b4b4(Te6edf3packetRepositoryTb4b4b4, Te6edf3secondIdTb4b4b4)Tb4b4b4.Te6edf3doWorkTb4b4b4(Tb4b4b4)

Te6edf3assertEqualsTb4b4b4(Te6edf3ListenableWorkerTb4b4b4.Te6edf3ResultTb4b4b4.Te6edf3successTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3firstResultTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3ListenableWorkerTb4b4b4.Te6edf3ResultTb4b4b4.Te6edf3successTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3secondResultTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6fffirstTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffsecondTa5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3radioControllerTb4b4b4.Te6edf3sentPacketsTb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3text Tb4b4b4}Tb4b4b4)
Te6edf3verifySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3claimQueuedPacketTb4b4b4(Te6edf3firstIdTb4b4b4) Tb4b4b4}
Te6edf3verifySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3claimQueuedPacketTb4b4b4(Te6edf3secondIdTb4b4b4) Tb4b4b4}
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ff`a stalled radio send does not block an unrelated claimed row`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3stalledId Tff7b72= Te6edf3PersistedPacketIdTb4b4b4(Te6edf3myNodeNum Tff7b72= T79c0ff1T79c0ff2T79c0ff3Tb4b4b4, Te6edf3uuid Tff7b72= T79c0ff1LTb4b4b4)
Tff7b72val Te6edf3otherId Tff7b72= Te6edf3PersistedPacketIdTb4b4b4(Te6edf3myNodeNum Tff7b72= T79c0ff1T79c0ff2T79c0ff3Tb4b4b4, Te6edf3uuid Tff7b72= T79c0ff2LTb4b4b4)
Tff7b72val Te6edf3stalled Tff7b72=
Te6edf3DataPacketTb4b4b4(
Te6edf3to Tff7b72= Ta5d6ff"Ta5d6ff!aaaa0001Ta5d6ff"Tb4b4b4,
Te6edf3bytes Tff7b72= Ta5d6ff"Ta5d6ffstalledTa5d6ff"Tb4b4b4.Te6edf3encodeToByteArrayTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toByteStringTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3dataType Tff7b72= T79c0ff1Tb4b4b4,
Te6edf3status Tff7b72= Te6edf3MessageStatusTb4b4b4.Te6edf3QUEUEDTb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3other Tff7b72=
Te6edf3DataPacketTb4b4b4(
Te6edf3to Tff7b72= Ta5d6ff"Ta5d6ff!bbbb0002Ta5d6ff"Tb4b4b4,
Te6edf3bytes Tff7b72= Ta5d6ff"Ta5d6ffotherTa5d6ff"Tb4b4b4.Te6edf3encodeToByteArrayTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toByteStringTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3dataType Tff7b72= T79c0ff1Tb4b4b4,
Te6edf3status Tff7b72= Te6edf3MessageStatusTb4b4b4.Te6edf3QUEUEDTb4b4b4,
Tb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3claimQueuedPacketTb4b4b4(Te6edf3stalledIdTb4b4b4) Tb4b4b4} Te6edf3returns Te6edf3PersistedPacketTb4b4b4(Te6edf3stalledIdTb4b4b4, Te6edf3stalledTb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3claimQueuedPacketTb4b4b4(Te6edf3otherIdTb4b4b4) Tb4b4b4} Te6edf3returns Te6edf3PersistedPacketTb4b4b4(Te6edf3otherIdTb4b4b4, Te6edf3otherTb4b4b4)
Tff7b72val Te6edf3stalledSendStarted Tff7b72= Te6edf3CompletableDeferredTff7b72<Tffa657UnitTff7b72>Tb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3releaseStalledSend Tff7b72= Te6edf3CompletableDeferredTff7b72<Tffa657UnitTff7b72>Tb4b4b4(Tb4b4b4)
Te6edf3radioControllerTb4b4b4.Te6edf3onSendMessage Tff7b72= Tb4b4b4{ Te6edf3packet Tff7b72-Tff7b72>
Tff7b72if Tb4b4b4(Te6edf3packetTb4b4b4.Te6edf3text Tff7b72=Tff7b72= Ta5d6ff"Ta5d6ffstalledTa5d6ff"Tb4b4b4) Tb4b4b4{
Te6edf3stalledSendStartedTb4b4b4.Te6edf3completeTb4b4b4(Tffa657UnitTb4b4b4)
Te6edf3releaseStalledSendTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tff7b72val Te6edf3stalledResult Tff7b72= Te6edf3async Tb4b4b4{ Te6edf3workerTb4b4b4(Te6edf3packetRepositoryTb4b4b4, Te6edf3stalledIdTb4b4b4)Tb4b4b4.Te6edf3doWorkTb4b4b4(Tb4b4b4) Tb4b4b4}
Te6edf3stalledSendStartedTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)

Tff7b72val Te6edf3otherResult Tff7b72= Te6edf3workerTb4b4b4(Te6edf3packetRepositoryTb4b4b4, Te6edf3otherIdTb4b4b4)Tb4b4b4.Te6edf3doWorkTb4b4b4(Tb4b4b4)

Te6edf3assertEqualsTb4b4b4(Te6edf3ListenableWorkerTb4b4b4.Te6edf3ResultTb4b4b4.Te6edf3successTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3otherResultTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffotherTa5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3radioControllerTb4b4b4.Te6edf3sentPacketsTb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3text Tb4b4b4}Tb4b4b4)
Te6edf3releaseStalledSendTb4b4b4.Te6edf3completeTb4b4b4(Tffa657UnitTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3ListenableWorkerTb4b4b4.Te6edf3ResultTb4b4b4.Te6edf3successTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3stalledResultTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3setOfTb4b4b4(Ta5d6ff"Ta5d6ffstalledTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffotherTa5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3radioControllerTb4b4b4.Te6edf3sentPacketsTb4b4b4.Te6edf3mapNotNull Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3text Tb4b4b4}Tb4b4b4.Te6edf3toSetTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffDEPRECATIONTa5d6ff"Tb4b4b4)
Tff7b72fun Td2a8ff`legacy and UUID jobs coexist without duplicate send`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3meshPacketId Tff7b72= T79c0ff7T79c0ff7
Tff7b72val Te6edf3persistedId Tff7b72= Te6edf3PersistedPacketIdTb4b4b4(Te6edf3myNodeNum Tff7b72= T79c0ff1T79c0ff2T79c0ff3Tb4b4b4, Te6edf3uuid Tff7b72= T79c0ff9LTb4b4b4)
Tff7b72val Te6edf3queued Tff7b72=
Te6edf3DataPacketTb4b4b4(
Te6edf3to Tff7b72= Ta5d6ff"Ta5d6ff!aaaa0001Ta5d6ff"Tb4b4b4,
Te6edf3bytes Tff7b72= Ta5d6ff"Ta5d6ffupgradeTa5d6ff"Tb4b4b4.Te6edf3encodeToByteArrayTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toByteStringTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3dataType Tff7b72= T79c0ff1Tb4b4b4,
Te6edf3id Tff7b72= Te6edf3meshPacketIdTb4b4b4,
Te6edf3status Tff7b72= Te6edf3MessageStatusTb4b4b4.Te6edf3QUEUEDTb4b4b4,
Tb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3claimQueuedPacketByPacketIdIfUniqueTb4b4b4(Te6edf3meshPacketIdTb4b4b4) Tb4b4b4} Te6edf3returns
Te6edf3PersistedPacketTb4b4b4(Te6edf3persistedIdTb4b4b4, Te6edf3queuedTb4b4b4)

Tff7b72val Te6edf3legacyResult Tff7b72= Te6edf3legacyWorkerTb4b4b4(Te6edf3packetRepositoryTb4b4b4, Te6edf3meshPacketIdTb4b4b4)Tb4b4b4.Te6edf3doWorkTb4b4b4(Tb4b4b4)

Te6edf3everySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3claimQueuedPacketTb4b4b4(Te6edf3persistedIdTb4b4b4) Tb4b4b4} Te6edf3returns
Te6edf3PersistedPacketTb4b4b4(Te6edf3persistedIdTb4b4b4, Te6edf3queuedTb4b4b4.Te6edf3copyTb4b4b4(Te6edf3status Tff7b72= Te6edf3MessageStatusTb4b4b4.Te6edf3ENROUTETb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3stableResult Tff7b72= Te6edf3workerTb4b4b4(Te6edf3packetRepositoryTb4b4b4, Te6edf3persistedIdTb4b4b4)Tb4b4b4.Te6edf3doWorkTb4b4b4(Tb4b4b4)

Te6edf3assertEqualsTb4b4b4(Te6edf3ListenableWorkerTb4b4b4.Te6edf3ResultTb4b4b4.Te6edf3successTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3legacyResultTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3ListenableWorkerTb4b4b4.Te6edf3ResultTb4b4b4.Te6edf3successTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3stableResultTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffupgradeTa5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3radioControllerTb4b4b4.Te6edf3sentPacketsTb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3text Tb4b4b4}Tb4b4b4)
Te6edf3verifySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3claimQueuedPacketByPacketIdIfUniqueTb4b4b4(Te6edf3meshPacketIdTb4b4b4) Tb4b4b4}
Te6edf3verifySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3claimQueuedPacketTb4b4b4(Te6edf3persistedIdTb4b4b4) Tb4b4b4}
Tb4b4b4}

Tf0883e@Test
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffDEPRECATIONTa5d6ff"Tb4b4b4)
Tff7b72fun Td2a8ff`legacy job fails without sending when packet id is ambiguous`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3meshPacketId Tff7b72= T79c0ff7T79c0ff7
Te6edf3everySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3claimQueuedPacketByPacketIdIfUniqueTb4b4b4(Te6edf3meshPacketIdTb4b4b4) Tb4b4b4} Te6edf3returns Tff7b72null

Tff7b72val Te6edf3result Tff7b72= Te6edf3legacyWorkerTb4b4b4(Te6edf3packetRepositoryTb4b4b4, Te6edf3meshPacketIdTb4b4b4)Tb4b4b4.Te6edf3doWorkTb4b4b4(Tb4b4b4)

Te6edf3assertEqualsTb4b4b4(Te6edf3ListenableWorkerTb4b4b4.Te6edf3ResultTb4b4b4.Te6edf3failureTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3resultTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3emptyListTff7b72<Te6edf3DataPacketTff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3radioControllerTb4b4b4.Te6edf3sentPacketsTb4b4b4)
Te6edf3verifySuspendTb4b4b4(Te6edf3mode Tff7b72= Te6edf3VerifyModeTb4b4b4.Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3rollbackEnroutePacketTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffworkerTb4b4b4(Te6edf3repositoryTb4b4b4: Te6edf3PacketRepositoryTb4b4b4, Te6edf3persistedIdTb4b4b4: Te6edf3PersistedPacketIdTb4b4b4)Tb4b4b4: Te6edf3SendMessageWorker Tff7b72=
Te6edf3TestListenableWorkerBuilderTff7b72<Te6edf3SendMessageWorkerTff7b72>Tb4b4b4(Te6edf3contextTb4b4b4)
Tb4b4b4.Te6edf3setInputDataTb4b4b4(
Te6edf3workDataOfTb4b4b4(
Te6edf3SendMessageWorkerTb4b4b4.Te6edf3KEY_PACKET_UUID Te6edf3to Te6edf3persistedIdTb4b4b4.Te6edf3uuidTb4b4b4,
Te6edf3SendMessageWorkerTb4b4b4.Te6edf3KEY_MY_NODE_NUM Te6edf3to Te6edf3persistedIdTb4b4b4.Te6edf3myNodeNumTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4.Te6edf3setWorkerFactoryTb4b4b4(
Tff7b72object Tb4b4b4: T56d364androidxTb4b4b4.Te6edf3workTb4b4b4.Te6edf3WorkerFactoryTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72override Tff7b72fun Td2a8ffcreateWorkerTb4b4b4(
Te6edf3appContextTb4b4b4: Te6edf3ContextTb4b4b4,
Te6edf3workerClassNameTb4b4b4: Tffa657StringTb4b4b4,
Te6edf3workerParametersTb4b4b4: Te6edf3WorkerParametersTb4b4b4,
Tb4b4b4)Tb4b4b4: Te6edf3ListenableWorker? Tff7b72= Te6edf3SendMessageWorkerTb4b4b4(Te6edf3appContextTb4b4b4, Te6edf3workerParametersTb4b4b4, Te6edf3repositoryTb4b4b4, Te6edf3radioControllerTb4b4b4)
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)

Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffDEPRECATIONTa5d6ff"Tb4b4b4)
Tff7b72private Tff7b72fun Td2a8fflegacyWorkerTb4b4b4(Te6edf3repositoryTb4b4b4: Te6edf3PacketRepositoryTb4b4b4, Te6edf3packetIdTb4b4b4: Tffa657IntTb4b4b4)Tb4b4b4: Te6edf3SendMessageWorker Tff7b72=
Te6edf3TestListenableWorkerBuilderTff7b72<Te6edf3SendMessageWorkerTff7b72>Tb4b4b4(Te6edf3contextTb4b4b4)
Tb4b4b4.Te6edf3setInputDataTb4b4b4(Te6edf3workDataOfTb4b4b4(Te6edf3SendMessageWorkerTb4b4b4.Te6edf3KEY_PACKET_ID Te6edf3to Te6edf3packetIdTb4b4b4)Tb4b4b4)
Tb4b4b4.Te6edf3setWorkerFactoryTb4b4b4(
Tff7b72object Tb4b4b4: T56d364androidxTb4b4b4.Te6edf3workTb4b4b4.Te6edf3WorkerFactoryTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72override Tff7b72fun Td2a8ffcreateWorkerTb4b4b4(
Te6edf3appContextTb4b4b4: Te6edf3ContextTb4b4b4,
Te6edf3workerClassNameTb4b4b4: Tffa657StringTb4b4b4,
Te6edf3workerParametersTb4b4b4: Te6edf3WorkerParametersTb4b4b4,
Tb4b4b4)Tb4b4b4: Te6edf3ListenableWorker? Tff7b72= Te6edf3SendMessageWorkerTb4b4b4(Te6edf3appContextTb4b4b4, Te6edf3workerParametersTb4b4b4, Te6edf3repositoryTb4b4b4, Te6edf3radioControllerTb4b4b4)
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)
Tb4b4b4}

Served by rngit 1.5.0 - Generated in 0.1s